import def from './utils.js';

// 得到Array的prototype属性的原型对象
let arrayPrototype = Array.prototype;
// 以Array.prototype对象为原型创建arrayMethods对象，并暴露
export  const arrayMethods = Object.create(arrayPrototype);
// 要被改写的7个数组方法
let methodsNeedChange = ['push','pop','shift','unshift','sort','reverse','splice'];
// 开始改写数组的这7个方法
methodsNeedChange.forEach(methodName=>{
	let original = arrayPrototype[methodName];
	// 定义新方法
	def(arrayMethods,methodName,function(){
		//恢复原理等功能
		const result = original.apply(this,arguments);
		//把类数组对象转成数组
		let args = [...arguments];
		// 把这个数组身上的__ob__属性取出来，__ob__属性已经被添加了的，为什么？因为数组坑定不是最高层，比如obj.g 是数组，那么obj必然不是数组而是对象，第一次
		// 遍历obj这个对象的第一层的时候已经给g属性（这个数组）添加上了__ob__属性了
		const ob = this.__ob__;
		//有三个方法是关于插入项目的他们是push/unshift/splice，那么要把新插入的的项也要变成observe的
		let inserted = [];
		switch (methodName){
			case 'push':
			case 'unshift':
				inserted = args;
				break;
			case 'splice':
				//splice(下标，个数，插入的新项)
				inserted = args.slice(2);
				break;
		}
		//判断有没有插入的新项,将新项目也变成可以侦测的
		if(inserted){
			ob.observeArray(inserted);
		};
		console.log('尝试设置数组'+this+'的'+arguments+'值');
		//数组的操作也必须触发依赖
		ob.dep.notify();
		
		return result
	},false)
}) 

